package section5_5;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;

/**
 * Created by Hyman on 2017/6/12.
 *
 * 在任务中抛出异常
 *
 * 当任务抛出运行时异常时，会影响它的父任务（发送到ForkJoinPool类的任务），以及父任务的父任务，以此类推。
 * 查阅程序的输出结果，将会发现有一些任务没有结束的信息。
 * 这些任务是那些抛出异常的任务和它的父任务。所有这些任务都是异常结束的。
 * 记住一点：在用ForkJoinPool对象和ForkJoinTask对象开发一个程序时，它们是会抛出异常的，如果不想要这种行为，就得采用其他方式。
 */
public class Main {

    public static void main(String[] args) {

        int[] array = new int[100];
        Task task = new Task(array, 0, 100);

        ForkJoinPool pool = new ForkJoinPool();
        pool.execute(task);

        pool.shutdown();

        try {
            pool.awaitTermination(1, TimeUnit.DAYS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if(task.isCompletedAbnormally()) {
            System.out.printf("Main: An exception has occurred\n");
            System.out.printf("Main: %s\n", task.getException());
        }

        System.out.printf("Main: Result: %d", task.join());

    }

}
